Y86-64 Note

Y86-64指令集体系结构

Y86-64指令

指令集

image-20231027153353079

image-20231027153915994

image-20231028154802068

寄存器

image-20231027153955332

逻辑设计

HCL

逻辑门

image-20231028144842113

组合逻辑

算术/逻辑单元ALU

image-20231028150227878

image-20231028145008938

时序逻辑:锁存器

image-20231028151734969

image-20231028151815081

Y86-64顺序实现

阶段

指令处理

image-20231104104728102

image-20231028152100068

image-20231028152211227

image-20231028152452031

image-20231028152528625

image-20231028152304481

image-20231028152325324

Y86-64硬件结构

SEQ

【总览图】

image-20231027152632950

SEQ阶段实现

image-20231028154534648

取指阶段

image-20231027150343819

 

译码与写回阶段

image-20231027150440385

执行阶段

image-20231027150511657

访存阶段

image-20231027150530593

 

更新PC

image-20231027150546442

 

SEQ+

【总览图】

image-20240103231321296

SEQ->SEQ+(前置PC)

PIPE-

【总览图】

image-20231027152737998

SEQ+->PIPE-(阶段划分)

在 Y86-64 的实现中:

插入流水线寄存器

分别插入了5个流水线寄存器用来保存后续阶段所需的信号,编号为FDEMW

寄存器顺序:F—f—D—d—E—e—M—m—W

各个寄存器作用:

F:保存程序计数器的预测值

D:保存取指信息

E:保存关于最新译码的指令 && 从寄存器文件中读出的值

M:保存最新执行指令的结果 && 关于处理条件转移的分支条件和目标信息

W:位于访存和反馈路径之间

在SEQ+中,在译码阶段通过逻辑电路计算得到dstEdstM,会直接将其连接到寄存器文件的写端口的地址输入,当计算出valEvalM时直接写回到对应寄存器中。但是dstEdstM是在译码阶段计算出来的,而valE是在执行阶段计算得到,valM是在访存阶段获得的,在流水线系统PIPE-中各个阶段是相互独立的,当某条指令运行到写回阶段时,得到了valEvalM,但是当前的dstEdstM是处于译码阶段的指令计算出来的,会出现错误,所以需要将dstEdstM一直保存到后续的流水线寄存器中。

通用规则:我们要保存处于一个流水线阶段中的指令的所有信息

只有call指令需要将valP保存到内存中,即我们为了call指令需要将取指阶段得到的valP一直保存到后续的流水线寄存器中,直到访存阶段将其保存到内存中。但是我们发现call指令只使用valB保存%rsp的值,并不会使用valA,所以我们可以通过PIPE-中的selectA模块将valP保存到valA,由此就不需要保存valP了。同理条件跳转指令,当不选择跳转分支时,后面也需要valP,也可以将其保存到valA中,由此也不需要保存valP了。

通用规则:通过合并信号来减少寄存器状态和线路的数量

信号的重新排列和标号
预测下一个PC

 

PIPE

【总览图】

image-20231027152743291

PIPE- ->PIPE(处理冒险)

硬件:暂停和气泡

image-20231028165720288

结构冒险

 

数据冒险
用暂停来避免数据冒险

若不插入:

屏幕截图 2023-10-24 232557

版本1:

屏幕截图 2023-10-24 232524

版本2:

屏幕截图 2023-10-24 232630

 

前后使用数据冒险

在处理器中,valAvalB一共有5个转发源:

555555555

 

加载/使用数据冒险

image-20231028165443562

image-20231028165451749

image-20231029031539550

 

控制冒险
ret指令(不预测)

image-20231028165443562

image-20231028165451749

版本1

image-20231025021929640

版本2

image-20231025022211833

跳转指令(预测)

处理预测错误的分支

image-20231028165443562

image-20231028165451749

image-20231028165611034

 

检验自洽
控制条件组合

image-20231025022503322

image-20231025022538498

image-20231025022550241

 

异常处理

要求:异常指令之前的所有指令已经完成,后续的指令都不能修改条件码寄存器和内存。

问题:

  1. 当同时多条指令引起异常时,处理器应该向操作系统报告哪个异常?

    基本原则:由流水线中最深的指令引起的异常,表示该指令越早执行,优先级最高。

  2. 在分支预测中,当预测分支中出现了异常,而后由于预测错误而取消该指令时,需要取消异常。

  3. 如何处理不同阶段更新系统状态不同部分的问题?

    • 异常发生时,记录指令状态,继续取指、译码、执行

    • 异常到达访存阶段

      1. 执行阶段,禁止设置条件码(set_cc m_stat, W_stat)

      2. 访存阶段,插入气泡,禁止写入内存

      3. 写回阶段,暂停写回,即暂停流水线

image-20231028165416003

  • 控制权移交操作系统

    • 统例外程序计数器(SEPC)

    • 系统例外原因寄存器(SCAUSE)

  • PC的更新

    • 非精确中断(PIPE)

    • 精确中断(RISC-V)

 

PIPE阶段实现

image-20231104142630934

PC选择和取指阶段

image-20231028165003315

译码和写回阶段

image-20231028165037596

执行阶段

image-20231028165051875

访存阶段

image-20231028165104144

控制逻辑

image-20231028172103735

image-20231025022406160

image-20231025022428424

 

image-20231028173847852

image-20231028173851414